// 版权归Epic Games, Inc.所有。保留所有权利。

#include "LyraIndicatorManagerComponent.h"

#include "IndicatorDescriptor.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraIndicatorManagerComponent)

/**
 * 构造函数
 * @param ObjectInitializer 对象初始化器
 */
ULyraIndicatorManagerComponent::ULyraIndicatorManagerComponent(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
	bAutoRegister = true; // 自动注册
	bAutoActivate = true; // 自动激活
}

/**
 * 获取控制器的指示器管理器组件
 * @param Controller 控制器
 * @return 指示器管理器组件
 */
/*static*/ ULyraIndicatorManagerComponent* ULyraIndicatorManagerComponent::GetComponent(AController* Controller)
{
	// 如果控制器存在，查找并返回指示器管理器组件
	if (Controller)
	{
		return Controller->FindComponentByClass<ULyraIndicatorManagerComponent>();
	}

	return nullptr; // 返回空指针
}

/**
 * 添加指示器
 * @param IndicatorDescriptor 指示器描述符
 */
void ULyraIndicatorManagerComponent::AddIndicator(UIndicatorDescriptor* IndicatorDescriptor)
{
	IndicatorDescriptor->SetIndicatorManagerComponent(this); // 设置指示器管理器组件
	OnIndicatorAdded.Broadcast(IndicatorDescriptor); // 广播指示器添加事件
	Indicators.Add(IndicatorDescriptor); // 添加到指示器数组
}

/**
 * 移除指示器
 * @param IndicatorDescriptor 指示器描述符
 */
void ULyraIndicatorManagerComponent::RemoveIndicator(UIndicatorDescriptor* IndicatorDescriptor)
{
	// 如果指示器描述符存在
	if (IndicatorDescriptor)
	{
		// 确保指示器描述符的管理器组件是当前组件
		ensure(IndicatorDescriptor->GetIndicatorManagerComponent() == this);
	
		OnIndicatorRemoved.Broadcast(IndicatorDescriptor); // 广播指示器移除事件
		Indicators.Remove(IndicatorDescriptor); // 从指示器数组中移除
	}
}